import os  # 操作系统接口模块，用于与操作系统交互
import sys  # 系统相关参数和函数模块，提供对Python解释器的访问
import json  # JSON编码和解码模块，用于处理JSON数据
import re  # 正则表达式模块，用于字符串模式匹配
from datetime import datetime, timedelta  # 日期时间模块，用于处理日期和时间
import logging  # 日志记录模块，用于记录程序运行信息

logging.basicConfig(
    level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)


def os_demo():
    current_dir = os.getcwd()
    print(current_dir)

    print(os.listdir("."))

    if not os.path.exists("test_dir"):
        os.mkdir("test_dir")
        print("创建了test_dir目录")

    # path_var = os.environ.get('PATH', '未找到PATH环境变量')
    # print(f"PATH环境变量前50个字符: {path_var[:500]}...")

    file_path = os.path.join("test_dir", "test_file.txt")
    print(f"构建的文件路径: {file_path}")

    if os.path.exists("test_dir"):
        os.rmdir("test_dir")  # 删除test_dir目录
        print("删除了test_dir目录")


def sys_demo():
    """sys模块示例 - 演示系统相关参数和函数的使用"""
    print("\n=== sys模块示例 ===")

    # Python版本
    # version属性包含Python解释器的版本信息
    print(f"Python版本: {sys.version}")

    # 平台信息
    # platform属性返回当前运行的操作系统平台
    print(f"平台: {sys.platform}")

    # 命令行参数
    # argv列表包含传递给Python脚本的命令行参数
    # 第一个元素（argv[0]）是脚本名称
    print(f"命令行参数: {sys.argv}")

    # 最大递归深度
    # getrecursionlimit()返回Python解释器的最大递归深度限制
    print(f"最大递归深度: {sys.getrecursionlimit()}")

    # 标准输入输出
    # stdout是标准输出流，print函数默认输出到stdout
    # file参数可以指定输出流
    print("这是一个通过sys.stdout.write输出的消息", file=sys.stdout)


def json_demo():
    """json模块示例 - 演示JSON编码和解码的使用"""
    print("\n=== json模块示例 ===")

    # Python对象转JSON
    # 创建一个包含不同类型数据的Python字典
    data = {
        "name": "张三",  # 字符串
        "age": 30,  # 整数
        "city": "北京",  # 字符串
        "skills": ["Python", "Java", "C++"],  # 列表
    }

    # dumps()函数将Python对象转换为JSON字符串
    # ensure_ascii=False允许非ASCII字符正常显示
    # indent=2设置JSON格式化输出，缩进2个空格
    json_str = json.dumps(data, ensure_ascii=False, indent=2)
    print(f"Python对象转JSON:\n{json_str}")

    # JSON转Python对象
    # loads()函数将JSON字符串转换为Python对象
    parsed_data = json.loads(json_str)
    print(f"JSON转Python对象: {parsed_data}")

    # 读写JSON文件
    # 使用with语句安全地打开和关闭文件
    # 'w'模式表示写入模式，encoding='utf-8'指定文件编码
    with open("data.json", "w", encoding="utf-8") as f:
        # dump()函数将Python对象直接写入文件
        json.dump(data, f, ensure_ascii=False, indent=2)
    print("已将数据写入data.json文件")

    # 'r'模式表示读取模式
    with open("data.json", "r", encoding="utf-8") as f:
        # load()函数从文件中读取JSON数据并转换为Python对象
        loaded_data = json.load(f)
    print(f"从文件读取的数据: {loaded_data}")

    # 清理测试文件
    # path.exists()检查文件是否存在，remove()删除文件
    if os.path.exists("data.json"):
        os.remove("data.json")
        print("已删除测试文件data.json")


def re_demo():
    """re模块示例 - 演示正则表达式的使用"""
    print("\n=== re模块示例 ===")
    
    # 测试文本
    text = "我的邮箱是example@example.com，电话是13812345678"
    
    # 查找邮箱
    # 定义邮箱匹配的正则表达式模式
    # \b表示单词边界，[A-Za-z0-9._%+-]+匹配邮箱用户名部分
    # @匹配@符号，[A-Za-z0-9.-]+匹配域名部分
    # \.匹配点号，[A-Z|a-z]{2,}匹配顶级域名
    email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
    # findall()函数查找所有匹配的字符串，返回列表
    emails = re.findall(email_pattern, text)
    print(f"找到的邮箱: {emails}")
    
    # 查找电话号码
    # 1[3-9]\d{9}匹配中国大陆手机号码格式
    # 1表示以1开头，[3-9]表示第二位是3-9之间的数字
    # \d{9}表示后面跟着9个数字
    phone_pattern = r'1[3-9]\d{9}'
    phones = re.findall(phone_pattern, text)
    print(f"找到的电话号码: {phones}")
    
    # 替换
    # sub()函数用于替换匹配的字符串
    # 第一个参数是模式，第二个参数是替换内容，第三个参数是原始字符串
    new_text = re.sub(email_pattern, '[邮箱]', text)
    new_text = re.sub(phone_pattern, '[电话]', new_text)
    print(f"替换后的文本: {new_text}")
    
    # 分组
    # 使用圆括号()创建分组，可以分别提取匹配的部分
    url = "https://www.example.com/path/to/page"
    # (https?)匹配http或https，([\w.-]+)匹配域名，(.*)匹配路径
    url_pattern = r'(https?)://([\w.-]+)/(.*)'
    # match()函数从字符串开头匹配模式
    match = re.match(url_pattern, url)
    if match:
        # groups()方法返回所有分组匹配的内容
        protocol, domain, path = match.groups()
        print(f"协议: {protocol}, 域名: {domain}, 路径: {path}")

def datetime_demo():
    """datetime模块示例 - 演示日期和时间的使用"""
    print("\n=== datetime模块示例 ===")
    
    # 当前时间
    # now()方法返回当前的日期和时间
    now = datetime.now()
    print(f"当前时间: {now}")
    
    # 格式化时间
    # strftime()方法将日期时间对象格式化为字符串
    # %Y表示四位年份，%m表示月份，%d表示日期
    # %H表示小时，%M表示分钟，%S表示秒
    formatted = now.strftime("%Y年%m月%d日 %H:%M:%S")
    print(f"格式化时间: {formatted}")
    
    # 解析时间字符串
    # strptime()方法将字符串解析为日期时间对象
    # 第二个参数是格式字符串，必须与时间字符串格式匹配
    date_str = "2025-12-25 15:30:00"
    parsed_date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
    print(f"解析的时间: {parsed_date}")
    
    # 时间计算
    # timedelta表示时间间隔，可以用于日期时间的加减运算
    # days=100表示100天的时间间隔
    future_date = now + timedelta(days=100)
    print(f"100天后的日期: {future_date}")
    
    # 时间差
    # 两个日期时间对象相减得到时间差（timedelta对象）
    diff = future_date - now
    print(f"时间差: {diff}")

def logging_demo():
    """logging模块示例 - 演示日志记录的使用"""
    print("\n=== logging模块示例 ===")
    
    # 不同级别的日志
    # debug()记录调试信息，通常用于开发阶段
    logger.debug("这是调试信息")
    # info()记录一般信息，用于确认程序正常运行
    logger.info("这是普通信息")
    # warning()记录警告信息，表示可能有问题但程序仍可运行
    logger.warning("这是警告信息")
    # error()记录错误信息，表示发生了错误
    logger.error("这是错误信息")
    # critical()记录严重错误信息，表示程序可能无法继续运行
    logger.critical("这是严重错误信息")
    
    # 记录异常
    # exception()方法用于记录异常信息，通常在except块中使用
    # 它会自动记录异常的类型和堆栈跟踪
    try:
        result = 10 / 0  # 故意制造除零错误
    except ZeroDivisionError:
        logger.exception("发生了除零错误")
    
    # 自定义日志格式和输出文件
    # getLogger()创建或获取指定名称的日志记录器
    file_logger = logging.getLogger('file_logger')
    # setLevel()设置日志记录器的级别
    file_logger.setLevel(logging.INFO)
    
    # 创建文件处理器
    # 如果测试文件已存在，先删除它
    if os.path.exists('app.log'):
        os.remove('app.log')  # 清理之前的日志文件
    
    # FileHandler将日志输出到文件
    # encoding='utf-8'确保中文正确显示
    file_handler = logging.FileHandler('app.log', encoding='utf-8')
    # 创建格式化器，定义日志输出格式
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    # setFormatter()设置处理器的格式化器
    file_handler.setFormatter(formatter)
    # addHandler()将处理器添加到日志记录器
    file_logger.addHandler(file_handler)
    
    # 记录日志到文件
    # 这些日志将被写入app.log文件
    file_logger.info("这是一条记录到文件的日志")
    file_logger.error("这是一条错误日志记录到文件")
    
    # 清理测试文件
    # 先关闭文件处理器，再删除文件
    file_logger.removeHandler(file_handler)
    file_handler.close()
    if os.path.exists('app.log'):
        os.remove('app.log')
        print("已删除测试日志文件app.log")
if __name__ == "__main__":
    # os_demo()
    # sys_demo()
    # json_demo()
    # re_demo()
    # datetime_demo()
    logging_demo()
